home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
HPAVC
/
HPAVC CD-ROM.iso
/
MCASM.RAR
/
MC_ASM.EXE
/
WROX_ASM
/
CH10
/
PROGRAMS
/
RLE.ASM
< prev
next >
Wrap
Assembly Source File
|
1994-05-30
|
4KB
|
216 lines
; RLE coding
; Written by Malakhov K.A.
; Compile with TASM 3.0 or latter
; TASM RLE.ASM /MX /ZX /O
; CALL: rle_encode(char *buffinput,unsigned int inputlength,
; char *buffoutput);
; CALL: rle_decode(char *buffinput,unsigned int inputlength,
; char *buffoutput);
model large
PUBLIC _rle_encode
PUBLIC _rle_decode
.code
_rle_encode PROC C FAR
ARG buffi:dword,leng:word,buffo:dword
USES bx,cx,dx,di,si,ds,es
; Initialization
mov ax,leng
mov cs:lng,ax
mov ax,word ptr buffi+2
mov ds,ax
mov ax,word ptr buffo+2
mov es,ax
mov si,word ptr buffi
mov di,word ptr buffo
mov cs:count1,di
mov cs:count2,0
mov cs:begflg,1
inc di
cld
; Loop
ARH_01: mov cl,3fh
mov cs:count3,0
ARH_02: lodsb
mov bx,leng
dec bx
mov leng,bx
cmp bx,3
ja ARH_03
jmp ARH_kon
; Compare with next byte
ARH_03: cmp al,byte ptr ds:[si]
je ARH_04
; Not equal.
ARH_031: mov cs:begflg,0
stosb
inc word ptr cs:count2
mov ax,word ptr cs:count2
cmp ax,64000
jbe ARH_0311
jmp ARH_09
ARH_0311: inc byte ptr cs:count3
dec cl
jnz ARH_02
; Set controll code for not compressed block
mov dl,cs:count3
or dl,10000000b
mov bx,cs:count1
mov es:[bx],dl
inc word ptr cs:count2
mov cs:count1,di
inc di
mov cs:begflg,1
jmp ARH_01
ARH_032: dec di
jmp short ARH_041
; Compare with third byte
ARH_04: cmp al,byte ptr ds:[si+1]
jne ARH_031
dec si
inc word ptr leng
cmp cs:begflg,1
je ARH_032
; Set not compressed block
mov dl,cs:count3
or dl,10000000b
mov bx,cs:count1
mov es:[bx],dl
inc word ptr cs:count2
; Begin compressed block
ARH_041: mov cl,3fh
mov cs:count3,0
ARH_05: lodsb
mov bx,leng
dec bx
mov leng,bx
cmp bx,1
jbe ARH_06
cmp al,byte ptr ds:[si]
jne ARH_06
inc byte ptr cs:count3
dec cl
jnz ARH_05
mov dl,cs:count3
mov es:[di],dl
inc di
inc word ptr cs:count2
mov es:[di],al
inc word ptr cs:count2
inc di
mov cs:count1,di
jmp ARH_041
ARH_06: mov dl,cs:count3
inc dl
mov es:[di],dl
inc di
inc word ptr cs:count2
mov es:[di],al
inc word ptr cs:count2
inc di
mov cs:count1,di
inc di
mov cs:begflg,1
jmp ARH_01
ARH_kon: stosb
inc word ptr cs:count2
mov cx,cs:count2
cmp cx,64000
ja ARH_09
; Save the rest of bytes
inc byte ptr cs:count3
mov cx,leng
ARH_07: cmp cx,1
jb ARH_08
ARH_071: movsb
inc word ptr cs:count2
mov ax,cs:count2
cmp ax,cs:lng
ja ARH_09
inc byte ptr cs:count3
dec cx
jnz ARH_071
ARH_08:
mov al,cs:count3
or al,10000000b
mov bx,cs:count1
mov es:[bx],al
inc word ptr cs:count2
mov ax,cs:cs:count2
ret
ARH_09: xor ax,ax
ret
count1 dw ? ; Ptr for controll code
count2 dw ? ; Total bytes counter
count3 db ? ; Bytes counter in block
begflg db ?
lng dw ?
_rle_encode ENDP
; Decompression
_rle_decode PROC C FAR
ARG buffi:dword,leng:word,buffo:dword
USES bx,cx,dx,di,si,ds,es
; Init
mov ax,word ptr buffi+2
mov ds,ax
mov ax,word ptr buffo+2
mov es,ax
mov si,word ptr buffi
mov di,word ptr buffo
mov cs:count1,di
cld
; Load byte
DARH_01: lodsb
mov bx,leng
dec bx
mov leng,bx
cmp bx,0
je DARH_kon
; Check block
test al,10000000b
jz DARH_02
; Do not compressed
and al,01111111b
mov cl,al
xor ch,ch
DARH_011: movsb
mov bx,leng
dec bx
mov leng,bx
cmp bx,0
je DARH_kon
dec cx
jnz DARH_011
jmp short DARH_01
; Compressed
DARH_02: mov cl,al
xor ch,ch
lodsb
mov bx,leng
dec bx
mov leng,bx
cmp bx,0
je DARH_kon
rep stosb
jmp short DARH_01
DARH_kon: mov ax,di
sub ax,cs:count1
ret
_rle_decode ENDP
END